package com.youdianstar.app.common.util

import android.util.Log
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.JsonParser
import com.google.gson.JsonSyntaxException

/**
 * API请求和响应日志管理工具
 * 用于统一管理所有接口的入参和返回参数的日志打印
 */
object ApiLogger {
    private const val TAG = "ApiLogger"
    private val gson: Gson = GsonBuilder().setPrettyPrinting().create()
    
    /**
     * 打印API请求参数
     * @param apiName API名称
     * @param method HTTP方法
     * @param url 请求URL
     * @param params 请求参数
     */
    fun logRequest(apiName: String, method: String, url: String, params: Map<String, Any?>? = null) {
        val logMessage = buildString {
            appendLine("🚀 API请求: $apiName")
            appendLine("📍 方法: $method")
            appendLine("🔗 URL: $url")
            if (params != null && params.isNotEmpty()) {
                appendLine("📝 请求参数:")
                try {
                    val jsonString = gson.toJson(params)
                    val jsonElement = JsonParser.parseString(jsonString)
                    appendLine(gson.toJson(jsonElement))
                } catch (e: JsonSyntaxException) {
                    appendLine("参数解析失败: $params")
                }
            }
        }
        Log.d(TAG, logMessage)
    }
    
    /**
     * 打印API响应数据
     * @param apiName API名称
     * @param responseCode 响应码
     * @param responseMessage 响应消息
     * @param responseData 响应数据
     */
    fun logResponse(apiName: String, responseCode: Int, responseMessage: String?, responseData: Any?) {
        val logMessage = buildString {
            appendLine("✅ API响应: $apiName")
            appendLine("📊 响应码: $responseCode")
            appendLine("💬 响应消息: ${responseMessage ?: "无"}")
            if (responseData != null) {
                appendLine("📦 响应数据:")
                try {
                    val jsonString = gson.toJson(responseData)
                    val jsonElement = JsonParser.parseString(jsonString)
                    appendLine(gson.toJson(jsonElement))
                } catch (e: JsonSyntaxException) {
                    appendLine("响应数据解析失败: $responseData")
                }
            } else {
                appendLine("📦 响应数据: null")
            }
        }
        Log.d(TAG, logMessage)
    }
    
    /**
     * 打印API错误信息
     * @param apiName API名称
     * @param error 错误信息
     */
    fun logError(apiName: String, error: String) {
        val logMessage = buildString {
            appendLine("❌ API错误: $apiName")
            appendLine("🚨 错误信息: $error")
        }
        Log.e(TAG, logMessage)
    }
    
    /**
     * 打印API异常信息
     * @param apiName API名称
     * @param exception 异常对象
     */
    fun logException(apiName: String, exception: Throwable) {
        logException(apiName, exception, null, null, null, null)
    }
    
    /**
     * 打印API异常信息（带请求上下文）
     * @param apiName API名称
     * @param exception 异常对象
     * @param url 请求URL
     * @param method HTTP方法
     * @param params 请求参数
     * @param requestBody 请求体（用于POST等）
     */
    fun logException(
        apiName: String, 
        exception: Throwable,
        url: String? = null,
        method: String? = null,
        params: Map<String, Any?>? = null,
        requestBody: String? = null
    ) {
        val logMessage = buildString {
            appendLine("💥 API异常: $apiName")
            
            // 请求信息
            if (url != null) {
                appendLine("🔗 请求URL: $url")
            }
            if (method != null) {
                appendLine("📍 请求方法: $method")
            }
            if (params != null && params.isNotEmpty()) {
                appendLine("📝 请求参数:")
                try {
                    val jsonString = gson.toJson(params)
                    val jsonElement = JsonParser.parseString(jsonString)
                    appendLine(gson.toJson(jsonElement))
                } catch (e: JsonSyntaxException) {
                    appendLine("参数解析失败: $params")
                }
            }
            if (requestBody != null && requestBody.isNotEmpty()) {
                appendLine("📦 请求体:")
                try {
                    val jsonElement = JsonParser.parseString(requestBody)
                    appendLine(gson.toJson(jsonElement))
                } catch (e: Exception) {
                    appendLine(requestBody)
                }
            }
            
            // 异常信息
            appendLine("🚨 异常类型: ${exception.javaClass.simpleName}")
            appendLine("🚨 异常消息: ${exception.message}")
            appendLine("🚨 异常堆栈:")
            exception.stackTrace.take(20).forEach { element -> // 只显示前20行堆栈，避免日志过长
                appendLine("   at $element")
            }
        }
        Log.e(TAG, logMessage)
    }
}
